#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

void fcn1();
void fcn2();
void biggies(vector<string> &, vector<string>::size_type, ostream &, char);

int main()
{
    fcn1();
    fcn2();
    
    vector<string> words{"jumps", "quick", "turtle"};
    biggies(words, words.size(), cout, '!');
}

// 值捕获
void fcn1()
{
    size_t v1 = 42; // 局部变量
    // 将 v1 拷贝到名为 f 的可调用对象
    auto f = [v1] { return v1; };
    v1 = 0;
    auto j = f(); // j 为 42; f 保存了我们创建它时 v1 的拷贝
    cout << "fcn1 j: " << j << endl;
}

// 引用捕获
void fcn2()
{
    size_t v1 = 42; // 局部变量
    // 对象 f2 包含 v1 的引用
    auto f2 = [&v1] { return v1; };
    v1 = 0;
    auto j = f2(); // j 为 0; f2 保存 v1 的引用，而非拷贝
    cout << "fcn2 j: " << j << endl;
}

void biggies(vector<string> &words,
                vector<string>::size_type sz,
                ostream &os = cout, char c = ' ')
{
    // 与之前例子一样的重排 words 的代码
    // 打印 count 的语句改为打印到 os
    for_each(words.begin(), words.end(),
                [&os, c](const string &s) { os << s << c; });
}